package code.netty.codec;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.ChannelPipeline;
import io.netty.util.CharsetUtil;

/**
 * 1.自定义一个Handler,需要继承netty 规定好的 某个 HandlerAdapter
 * 2.这时我们自定义一个 Handler,才能称为一个 handler
 * @author rocky
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    /**
     * 读取数据实际, 这里我们可以读取客户端发送的消息
     * 1. ChannelHandlerContext ctx: 上下文对象,含有管道pipeline(业务处理),通道(数据读写)
     * 2. Object msg : 就是客户端发送的数据 默认 Object
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        // 读取客户端发送的 studentPojo.student
        StudentPoJo.Student student = (StudentPoJo.Student) msg;
        System.out.println("客户端发送的数据 id=" + student.getId() + "名字= " + student.getName());
    }

    /**
     * 数据读取完毕
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        // writeAndFlush 是write + flush
        // 将数据写入到缓存, 并刷新
        // 一般讲, 我们对这个发送的数据进行编码
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端~", CharsetUtil.UTF_8));
    }

    /**
     * 处理异常, 一般是需要关闭通道
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
